package main

import (
	"fmt"
	"time"
)

/*
*
互斥锁
*/
func main() {
	go func() {
		for i := 0; i < 5; i++ {
			d4_deposit(200, "aaa")
		}
	}()

	go func() {
		for i := 0; i < 5; i++ {
			d4_deposit(200, "bbb")
		}
	}()

	var input string
	fmt.Scanln(&input)
}

// 账号
var (
	// 信号量，同时只有1个goroutine可以运行
	// 用一个容量只有1的channel来保证最多只有一个goroutine在同一时刻访问一个共享变量
	semaphore = make(chan struct{}, 1)
	//一个只能为1和0的信号量叫做二元信号量(binary semaphore)
	balance int
)

// 存钱
func d4_deposit(amount int, name string) {
	semaphore <- struct{}{} // acquire token

	fmt.Println("存钱->begin, name=", name)
	balance += amount
	time.Sleep(1 * time.Second)
	fmt.Println("存钱->end, name=", name)

	<-semaphore // release token
}

// 查询余额
func d4_balance() int {
	semaphore <- struct{}{} // acquire token
	b := balance
	<-semaphore // release token
	return b
}
